package main

import (
	"context"
	"fmt"
	"github.com/micro/go-micro/client"
	"github.com/micro/go-micro/client/selector"
	"github.com/micro/go-micro/registry"
	microHttp "github.com/micro/go-plugins/client/http"
	"github.com/micro/go-plugins/registry/consul"
	"goMicro/day03/models"
	"log"
)

// 第一种 方式
func callAPI2(s selector.Selector) {

	microClient := microHttp.NewClient(
		client.Selector(s),
		client.ContentType("application/json"),
	)
	//req:=myClient.NewRequest("prodService","v1/prods",map[string]int{"size":3})
	//var rsp map[string]interface{}
	//err :=myClient.Call(context.Background(),req,&rsp)
	//if err!=nil{
	//	log.Fatal(err)
	//}
	//fmt.Println(rsp["data"])

	// 替换成 proto生成的go
	// 请求生成
	req := microClient.NewRequest("prodService", "v1/prods", models.ProdRequest{Size: 2})
	// 响应生成
	var rsp models.ProdListResponse
	// 发起请求
	//参数 ： context  请求(request)  响应(response)
	if err := microClient.Call(context.Background(), req, rsp); err != nil {
		log.Fatal(err)
	}
	fmt.Println(rsp.GetData())
}

func main() {
	consulReg := consul.NewRegistry(
		registry.Addrs("127.0.0.1:8500"),
	)
	mySelector := selector.NewSelector(
		selector.Registry(consulReg),          //注册中心
		selector.SetStrategy(selector.Random), //随机算法
	)
	callAPI2(mySelector)
}

// 第二种方式

//func callAPI (addr string,path string, method string)(string,error){
//	// 参数 ： 请求类型 ，请求路径 ，请求体（body）
//	req,_ := http.NewRequest(method,"http://"+addr+"/"+path,nil)
//	//req,_ := http.NewRequest(method,"http://www.baidu.com",nil)
//	resp,err := http.DefaultClient.Do(req)
//	//resp, err :=http.Post("http://"+addr+"/"+path,"application/x-www-form-urlencoded",nil)
//	if err!=nil {
//		return "",err
//	}
//	defer resp.Body.Close()
//	buf,_:=ioutil.ReadAll(resp.Body)
//	return string(buf),nil
//}
//// micro  API  调用
//func main (){
//	consulReg := consul.NewRegistry(
//		registry.Addrs("127.0.0.1:8500"),
//	)
//	for{
//		//获取服务列表
//		getService,err:= consulReg.GetService("prodService")
//		if err!=nil {
//			log.Fatal(err)
//		}
//		// 从getService服务列表中选择一个实例
//		next :=selector.Random(getService) //设置随机算法
//		//next :=selector.RoundRobin(getService)// 设置轮巡算法
//		node , err :=next() // 选择下一个
//		//if err!=nil {
//		//	log.Fatal(err)
//		//}
//		//fmt.Println("-------",node.Id,node.Address,node.Metadata)
//		//time.Sleep(time.Second)
//		callRes,err :=callAPI(node.Address,"v1/prods","POST")
//		if err!=nil {
//			log.Fatal(err)
//		}
//		fmt.Println(callRes)
//	}
//
//}
